package com.jy.common.tool;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 高德地图提供的服务
 *
 * @author fzg
 */

@Slf4j
public class GaoDeTool {

    // 高德地图Web服务API的Key，用于获取地理信息（省份城市列表等），替换为实际申请的Key
    private static final String GAODE_WEB_KEY = "4d745d5e19b4554fcccffd0d9bc01f06";
    // 高德地图Web端开发者Key，用于前端加载地图定位相关API（这里虽然在后端代码中只是用于构造接口URL，但前端页面需要用它来合法使用定位功能）
    private static final String GAODE_WEB_DEV_KEY = "385aac62a3717edd064ba26e0b34c4a3";
    // 高德地图定位接口URL，用于获取设备的当前位置信息（经纬度等）
    private static final String GAODE_LOCATION_URL = "https://restapi.amap.com/v3/geolocation/ip?key=" + GAODE_WEB_KEY;
    // 高德地图获取地区信息接口URL，用于通过省份名称获取该省份下的城市列表等信息，{province}是省份名称的占位符
    private static final String GAODE_DISTRICT_URL = "https://restapi.amap.com/v3/config/district?key=" + GAODE_WEB_KEY + "&keywords={province}&subdistrict=1&extensions=base";

    public static List<String>  getCitiesInCurrentProvince() throws IOException {

            // 第一步：获取当前设备的定位信息（经纬度等），通过发送GET请求到高德地图定位接口
            String locationResponse = HttpUtil.sendGetRequest(GAODE_LOCATION_URL, null);
            System.out.println(locationResponse);
            // 使用Gson将响应的JSON字符串转换为JsonObject方便解析
            JsonObject locationJson = new Gson().fromJson(locationResponse, JsonObject.class);
            // 从定位信息的JSON数据中获取省份名称，具体的JSON结构根据高德地图接口返回格式来解析
            String provinceName = locationJson.getAsJsonObject("province")!= null? locationJson.getAsJsonObject("province").get("name").getAsString() : "";
            System.out.println("省份名是");
            System.out.println(provinceName);
            // 第二步：通过获取到的省份名称，去获取该省份下的城市列表，构造请求参数并发送GET请求到高德地图获取地区信息接口
            Map<String, Object> params = new HashMap<>();
            params.put("province", provinceName);
            String districtResponse = HttpUtil.sendGetRequest(GAODE_DISTRICT_URL, params);
            JsonObject districtJson = new Gson().fromJson(districtResponse, JsonObject.class);

            // 第三步：解析获取地区信息接口返回的JSON数据，提取出城市名称列表
            List<String> cities = new ArrayList<>();
            if (districtJson.has("districts") && districtJson.get("districts").isJsonArray()) {
                JsonArray districtsArray = districtJson.getAsJsonArray("districts");
                for (JsonElement districtElement : districtsArray) {
                    JsonObject districtObject = districtElement.getAsJsonObject();
                    cities.add(districtObject.get("name").getAsString());
                }
            }
            return cities;
    }

}
